#include<iostream>
#include<cstdio>
#include<pthread.h>
#include<unistd.h>
#include<string>
#include<vector>

using namespace std;

void* threadname(void* args) //参数为基本类型
{
    const string& name = static_cast<char*>(args);
    while(true)
    {
        cout << "I am " << name << endl;
        sleep(2);  
    }
    return nullptr;
}

int main()
{
    vector<pthread_t> threads;
    for(int i = 1; i <= 5; i++) //多线程创建
    {
        //为每个线程分配独立的内存区域,防止出现数据竞争和不一致问题
        char* buffer = new char[64]; 
        //char buffer[64];
        snprintf(buffer, 64, "Thread-%d", i);
        pthread_t tid;
        pthread_create(&tid, nullptr, threadname, buffer);
        threads.push_back(tid);
    }

    for(auto& e : threads) //等待多线程
        pthread_join(e, nullptr);
}

// __thread int g_val = 3; //线性局部存储变量

// string ToHex(pthread_t id) //10进制转16进制(地址)
// {
//     char buffer[126];
//     snprintf(buffer, sizeof(buffer), "0x%lx", id);
//     return buffer;
// }

// void* newthreadrun(void* args) //子线程
// {
//     while(true)
//     {
//         cout << "newthread id: " << ToHex(pthread_self()) << ", g_val: " << g_val << ", &g_val: " << &g_val << endl;
//         g_val--;
//         if(g_val == 0) break;
//         sleep(1);
//     }

//     return nullptr;
// }

// int main()
// {
//     pthread_t tid; 
//     pthread_create(&tid, nullptr, newthreadrun, nullptr);

//     while(true)   //主线程
//     {
//         cout << "mainthread id: " << ToHex(pthread_self()) << ", g_val: " << g_val << ", &g_val: " << &g_val << endl;
//         if(g_val == 0) break;
//         sleep(1);
//     }

//     return 0;
// }


// void* thread1(void* args)
// {
//     cout << "thread1 is running...." << endl;
//     int* p1 = (int*)malloc(sizeof(int));
//     *p1 = 1; 
//     return (void*)p1;  
// }

// void* thread2(void* args)
// {
//     cout << "thread2 is running...." << endl;
//     int* p2 = (int*)malloc(sizeof(int));
//     *p2 = 2;
//     pthread_exit((void*)p2);
// }

// void * thread3(void* args)
// {
//     while(true)
//     {
//         cout <<"throw3 is running..." << endl;
//         sleep(1);
//     }

//     return nullptr;
// }

// int main()
// {
//     pthread_t tid;
//     void* retval = nullptr;

//     pthread_create(&tid, nullptr, thread1, nullptr);
//     pthread_join(tid, &retval);
//     cout << "thread1 ret: " << *(int*)retval << ", thread1 id" << ToHex(pthread_self()) << endl;

//     pthread_create(&tid, nullptr, thread2, nullptr);
//     pthread_join(tid, &retval);
//     cout << "thread2 ret: " << *(int*)retval << ", thread2 id" << ToHex(pthread_self()) << endl;

//     pthread_create(&tid, nullptr, thread3, nullptr);
//     pthread_cancel(tid);
//     pthread_join(tid, &retval);
//     if(retval == PTHREAD_CANCELED)
//         cout << "thread3 return, thread3 id: "<< ToHex(pthread_self()) << ", return code: PTHREAD_CANCELED\n" << endl;
//     else
//         cout << "thread3 return, thread3 id: "<< ToHex(pthread_self()) << ", return code: NULL" << endl;

//     return 0;
// }

// void* newthreadrun(void* args)
// {
//     while(true)  //新线程
//     {
//         cout << "I am a newthread, id: " << ToHex(pthread_self()) << endl;
//         sleep(1);
//     }

//     return nullptr;
// }

// int main()
// {
//     pthread_t tid; 
//     pthread_create(&tid, nullptr, newthreadrun, nullptr);

//     while(true)  //主线程
//     {
//         cout << "I am a mainthread, id: " << ToHex(pthread_self()) << endl;
//         sleep(1);
//     }

//     return 0;
// }